今天我們將深入人工智慧領域,專注於神經網絡的基礎——多層感知器(MLP),並實作一個模型來訓練手寫數字圖片辨識。這個課題將帶你領略如何從頭開始搭建並訓練深度學習模型,使用 Python 的強大工具來實現圖片辨識任務。
一、什麼是多層感知器 (MLP)?
多層感知器(MLP)是一種前饋神經網路,是神經網絡的基本結構之一。它包含多層神經元,並且每一層的輸出會傳遞給下一層,這樣的結構讓 MLP 能夠學習更複雜的非線性關係。
MLP 包含三大部分:
1. 輸入層 (Input Layer): 接收數據。
2. 隱藏層 (Hidden Layer): 多層神經元,用來學習數據特徵。
3. 輸出層 (Output Layer): 根據隱藏層的結果做出預測。
二、神經網路的運作原理
1. 前向傳播 (Forward Propagation): 數據從輸入層傳遞到隱藏層,再到輸出層,每層的神經元會加權和激活輸入,最後輸出結果。
2. 損失函數 (Loss Function): 衡量模型預測與實際標籤之間的誤差。
3. 反向傳播 (Backpropagation): 調整每層神經元的權重,使模型的預測逐漸接近真實結果,這個過程是模型學習的核心。
三、Mlp 的操作步驟
為了展示 MLP 的實際應用,我們將使用 MNIST 數據集,這是一個包含 28x28 手寫數字圖片的數據集,共有 10 個數字(0-9)的類別。可以使用 Keras 或 Scikit-learn 來載入這個數據集。
from tensorflow.keras.datasets import mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train = x_train.reshape(x_train.shape[0], 28 * 28).astype('float32') / 255
x_test = x_test.reshape(x_test.shape[0], 28 * 28).astype('float32') / 255
接下來我們將使用 Keras 建立一個簡單的 MLP 模型,這個模型包含三層:輸入層、隱藏層(帶有激活函數),以及輸出層(使用 softmax 作為激活函數來預測 10 個數字類別)。
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
model = Sequential()
model.add(Dense(128, input_shape=(784,), activation='relu')) # 隱藏層
model.add(Dense(64, activation='relu')) # 隱藏層
model.add(Dense(10, activation='softmax')) # 輸出層
編譯模型時需要選擇適合的損失函數與優化器,我們使用 categorical_crossentropy 作為損失函數,並且用 Adam 優化器來進行權重調整。訓練過程中,我們會設定批次大小與訓練迭代次數。
model.compile(loss='categorical_crossentropy',
optimizer='adam',
metrics=['accuracy'])
model.fit(x_train, y_train, batch_size=128, epochs=10, validation_data=(x_test, y_test))
四、模型訓練:MNIST 手寫數字辨識
我們將利用前述搭建好的 MLP 模型來訓練手寫數字辨識,並觀察模型的預測效果。
在訓練之前,我們需要對標籤進行 one-hot 編碼處理,這樣可以確保模型的輸出與標籤相匹配。
from tensorflow.keras.utils import to_categorical
y_train = to_categorical(y_train, 10)
y_test = to_categorical(y_test, 10)
模型會在每個 epoch 完成後,顯示訓練準確度與驗證準確度,我們可以根據這些數據來調整模型的參數,或者嘗試增加隱藏層的數量來改善模型性能。
五、模型評估與測試
訓練完成後,我們需要對模型進行測試,觀察其在未見過的測試數據上的表現。這樣可以確保模型具有良好的泛化能力。
score = model.evaluate(x_test, y_test, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])
模型評估結果中的準確率越高,表示模型對手寫數字的辨識效果越好。
六、使用自定義數據進行測試
為了驗證模型的實際應用,我們還可以從外部獲取手寫數字圖片,將其轉換成適合的數據格式,並使用模型進行預測。
如果我們有一張手寫數字的圖片,可以將其處理成 28x28 的灰度圖,然後輸入到我們的模型中進行預測。
from PIL import Image
import numpy as np
img = Image.open('digit.png').convert('L')
img = img.resize((28, 28))
img_arr = np.array(img).reshape(1, 784).astype('float32') / 255
prediction = model.predict(img_arr)
print('Predicted digit:', np.argmax(prediction))
七、未來擴展:深度學習與強化學習的更多應用
在掌握了 MLP 的基本操作與概念之後,未來可以擴展到更複雜的神經網絡結構,如卷積神經網絡(CNN)和遞歸神經網絡(RNN)。這些網絡可以應用在圖像分類、語音識別、自動駕駛等領域。此外,深度學習與強化學習的結合也可以帶來更多的智能應用場景。
擴展學習:
• CNN(卷積神經網路):適合處理圖片類型的數據。
• RNN(遞歸神經網路):適合處理序列數據,例如自然語言處理、時間序列預測。
• 強化學習:使得模型能夠透過與環境互動來學習,應用於遊戲 AI、自動駕駛等。
八、結論
今天的課題涵蓋了神經網路中最基本的 MLP 結構,並結合了 MNIST 手寫數字的實作範例。隨著模型訓練與測試的進行,我們應該已經對人工智慧中的基礎概念與模型建構有了初步的理解。接下來的學習將進一步深入到更複雜的模型結構與應用場景,如自然語言處理、圖像辨識等。